package cluedo.gui;

import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
import javax.swing.text.StyledDocument;

import cluedo.Player;
import cluedo.Zombie;


/**
 * 
 * Questa classe rappresenta una riga della NicknamesArea
 *
 */
public class NickRow {

	/**
	 * contiene l'icona proprietario gruppo
	 */
	private JLabel ownerImage=null;
	
	/**
	 * il player proprietario dello zombie associato a questa riga della nicknamesArea
	 */
	private Player myPlayer;
	
	/**
	 * contiene l'icona "e' il suo turno"
	 */
	private JLabel turnImage=null;
	
	/**
	 * contiene l'icona "zombie"
	 */
	private JLabel zombieImage=null;
	
	/**
	 * lunghezza di una riga senza contare il nickname di un player 
	 * (contando quindi solamente l'occupazione delle icone proprietario e turno)
	 */
	private int baseLength=-1;
	
	/**
	 * Costruttore di una linea della NickNamesArea
	 * @param myPlayer il player proprietario dello zombie associato a questa riga della nicknamesArea
	 * @param textPane la NicknamesArea
	 * @param p il player da cui ottenere il nickname da visualizzare
	 */
	public NickRow(Player myPlayer,JTextPane textPane, Zombie p){
		
		this.myPlayer=myPlayer;
		ownerImage=new JLabel();
		turnImage=new JLabel();
		zombieImage=new JLabel();
		ownerImage.setToolTipText("Proprietario");
		turnImage.setToolTipText("Ha il turno");
		zombieImage.setToolTipText("Zombie");
		String space=" ";
		String labelText="Ignored";
		
		StyledDocument doc = textPane.getStyledDocument();
		SimpleAttributeSet nameStyle = new SimpleAttributeSet();
        StyleConstants.setFontFamily(nameStyle,"Courier");
        StyleConstants.setBold(nameStyle,true);
        StyleConstants.setFontSize(nameStyle, 20);
        
        setImageIcon(ownerImage,"/img/owner.png",0.8f,20,false);
        setImageIcon(turnImage,"/img/dice.png",0.7f,30,false);
        setImageIcon(zombieImage,"/img/zombie.gif",0.8f,40,true);
               
        StyleContext context = new StyleContext();
		Style labelStyle = context.getStyle(StyleContext.DEFAULT_STYLE);
		
        StyleConstants.setComponent(labelStyle, ownerImage);

        try {
        	doc.insertString(doc.getLength(),space,nameStyle);
			doc.insertString(doc.getLength(), labelText, labelStyle);
			doc.insertString(doc.getLength(), space,nameStyle);
		} catch (BadLocationException badLocationException) {
			System.err.println("NickRow: Errore inserimento icona owner al nickname");
			badLocationException.printStackTrace();
		}
                
        StyleConstants.setComponent(labelStyle, turnImage);
        
        try {
			doc.insertString(doc.getLength(), labelText, labelStyle);
			doc.insertString(doc.getLength(), space,nameStyle);
		} catch (BadLocationException badLocationException) {
			System.err.println("NickRow: Errore inserimento icona turn al nickname");
			badLocationException.printStackTrace();
		}
        
        StyleConstants.setComponent(labelStyle, zombieImage);
        
        try {
			doc.insertString(doc.getLength(), labelText, labelStyle);
			doc.insertString(doc.getLength(), space,nameStyle);
		} catch (BadLocationException badLocationException) {
			System.err.println("NickRow: Errore inserimento icona zombie al nickname");
			badLocationException.printStackTrace();
		}
	
		StyleConstants.setForeground(nameStyle,myPlayer.getPlayerColor(p.getNickname()));
		
		baseLength=labelText.length()*3+space.length()*4;
		
		try{
			doc.insertString(doc.getLength(), p.getNickname(),nameStyle);
		} catch(BadLocationException exc) {
			exc.printStackTrace();
		}
			
	}
	
	
	/**
	 * Aggiunge un'icona ad una JLabel;
	 * Funzione di utilita' per aggiungere le icone in fase di creazione di una riga della NicknamesArea
	 * @param icon JLabel che conterra' l'icona
	 * @param path percorso da cui recuperare l'icona
	 * @param align allineamento verticale dell'icona rispetto al nickname
	 * @param scale regola la dimensione dell'icona
	 * @param isAnimatedGif true se e' un'immagine animata
	 */
	private void setImageIcon(JLabel icon, String path, float align, int scale, boolean isAnimatedGif){
		
	
		ImageIcon img= new ImageIcon(NickRow.class.getResource(path));
		Image tmpImg= img.getImage();
		if(isAnimatedGif) //lo SCALE_SMOOTH non funziona con le animazioni
			tmpImg= tmpImg.getScaledInstance(-1, scale, Image.SCALE_DEFAULT);
		else
			tmpImg= tmpImg.getScaledInstance(-1, scale, Image.SCALE_SMOOTH);
		img.setImage(tmpImg);
		icon.setIcon(img);
		icon.setAlignmentY(align);
		icon.setVisible(false);
		
		
	}
	
	/**
	 * Ottiene la lunghezza base della riga.
	 * Utile per poter rimuovere correttamente un nickname dalla NicknamesArea
	 * @return vedi descrizione
	 */
	public int getBaseLength(){
		
		return baseLength;
		
	}
	
	/** Specifica se il giocatore associato a questa linea e' il proprietario del gruppo
	 * @param b true se e' il proprietario del gruppo, false altrimenti
	 */
	public void setOwner(boolean b){
		
		ownerImage.setVisible(b);
	}
	
	/** Specifica se e' il turno del giocatore associato a questa linea
	 * @param b true se e' il suo turno, false altrimenti
	 */
	
	public void setHisTurn(boolean b){
		
		turnImage.setVisible(b);
	}
	
	/** Specifica se e' il giocatore associato a questa linea e' diventato uno zombie
	 * @param b true se e' uno zombie, false altrimenti
	 */
	public void setZombie(boolean b){
		
		zombieImage.setVisible(b);
	}
	
	/**
	 * Controlla se l'immagine dello zombie associata alla linea e' mostrata
	 * @return true se il player e' segnalato come morto, false altrimenti
	 */
	public boolean isZombieShown(){
		
		return zombieImage.isVisible();
		
	}
	
}
